#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)

#include <iostream>
#include <deque>
#include <vector>
#include <list>

using namespace std;

namespace aj
{
    template<class T, class Container = deque<T>>
    class stack
    {
    public:
        stack()
        {}

        void push(const T& x)
        {
            _con.push_back(x);
        }

        void pop()
        {
            _con.pop_back();
        }

        T& top()
        {
            return _con.back();
        }

        const T& top()const
        {
            return _con.back();
        }

        size_t size()const
        {
            return _con.size();
        }

        bool empty()const
        {
            return _con.empty();
        }

    private:
        Container _con;
    };
};


void test_Stack()
{
    aj::stack<int> st;

    st.push(1);
    st.push(2);
    st.push(4);
    st.push(6);
    st.push(9);
    st.push(0);

    while (!st.empty())
    {
        cout << "top:" << st.top() << "    ";
        cout << "size:" << st.size() << "    ";
        cout << "empty:" << st.empty() << endl;
        st.pop();
    }
}

